package com.mdd.common.util;

import com.mdd.common.vo.TaskScheduleModel;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Cron 工具类
 * @author shenjian
 * @createTime 2023年03月05日 11:20:00
 */
public class CronUtil {

    public static final String taskRegex = " |-|:";

    /**
     * 方法摘要：构建Cron表达式
     *
     * @param jobType 所选作业类型:
     * 0  -> 每分钟
     * 1  -> 每小时
     * 2  -> 每天
     * 3  -> 每周
     * 4  -> 每月
     * 5  -> 每年
     * @param startDate 启动时间
     */
    public static String createCronExpression(Integer jobType, String startDate) {

        //拆分时间字符串 年，月，日，时，分，秒
        String[] split1 = startDate.split(taskRegex);


        StringBuilder cronExp = new StringBuilder();

        if (null == jobType) {
            //执行周期未配置
            System.out.println("执行周期未配置");
        }

        if (null != split1[5] && null != split1[4] && null != split1[3]) {

            if(jobType == 0){

                //秒
                cronExp.append(split1[5]).append(" ");

                //每分钟
                cronExp.append("* ").append(" ");
                //小时
                cronExp.append("* ");
                //日
                cronExp.append("* ");
                //月
                cronExp.append("* ");
                //周
                cronExp.append("?");
            }else if(jobType == 1){

                //秒
                cronExp.append(split1[5]).append(" ");
                //分
                cronExp.append(split1[4]).append(" ");

                //每小时
                //小时
                cronExp.append("* ");
                //日
                cronExp.append("* ");
                //月
                cronExp.append("* ");
                //周
                cronExp.append("?");
            }else if(jobType == 2 || jobType == 3 ||
                    jobType == 4 || jobType == 5){

                //秒
                cronExp.append(split1[5]).append(" ");
                //分
                cronExp.append(split1[4]).append(" ");
                //时
                cronExp.append(split1[3]).append(" ");
            }

            //按每日
            if (jobType == 2) {

                //日
                cronExp.append("* ");
                //月
                cronExp.append("* ");
                //周
                cronExp.append("?");
            }
            //按每周
            else if (jobType == 3) {

                String[] split2 = startDate.split(" ");
                //创建格林威治时间
                Calendar instance = Calendar.getInstance();
//                instance.setTime(date);//将传来的时间设置到格林威治时间内
                int dayForWeek = instance.get(Calendar.DAY_OF_WEEK) - 1;
                //获取本周的周几
//               int dayForWeek = DataUtils.dayForWeek(split2[0]);
                //一个月中第几天
                cronExp.append("? ");
                //月份
                cronExp.append("* ");
                //周
                cronExp.append(dayForWeek + 1);
            }
            //按每月
            else if (jobType == 4) {
                //一个月中的哪几天
                cronExp.append(split1[2]);
                //月份
                cronExp.append(" * ");
                //周
                cronExp.append("?");
            }
            //按每年
            else if (jobType == 5) {

                //一个月中的哪几天
                cronExp.append(split1[2]).append(" ");
                //月份
                cronExp.append(split1[1]).append(" ");
                //周
                cronExp.append("?");
            }

        } else {
            //时或分或秒参数未配置
            System.out.println("时或分或秒参数未配置");
        }
        return cronExp.toString();
    }

    public static void main(String[] args) {
        String menuUpdateTime = "18:00";
        SimpleDateFormat format = new SimpleDateFormat("HH:mm");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = format.parse(menuUpdateTime);
            Calendar calendar = Calendar.getInstance();
            Calendar cal = Calendar.getInstance();
            calendar.setTime(date);
            cal.set(Calendar.HOUR, calendar.get(Calendar.HOUR));
            cal.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
            cal.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
            String s = dateFormat.format(cal.getTime());
            String expression = CronUtil.createCronExpression(2, s);
            System.out.println(expression);
        } catch (Exception e) {

        }
    }
}

